Microsoft Message Cards – kompletny przewodnik
Table of Contents
Post stanowiący pierwszą część serii opisywał ogólnie Message i Adaptive Cards, ich krótką historię i cel istnienia. Ten post koncentruje się wyłącznie na Message Cards – technologii, od której wszystko się zaczęło, i która nadal jest istnieje i działa, chociaż Microsoft zaleca migrację do Adaptive Cards.
Message Cards – wprowadzenie
Karty wiadomości są tworzone przy użyciu deklaratywnego kodu w formacie JSON. Następnie kod ten przetwarzany jest przez SDK i renderowany do atrakcyjnie wyglądającego elementu interfejsu użytkownika.
Można ich nadal używać w Outlook (zarówno wersji Desktop, jak i w przeglądarce):
Wątpię, aby stało się możliwe również używanie ich w aplikacji Outlook Mobile (w końcu Adaptive Cards są już wspierane). Message Cards mogą być także używane w Microsoft Teams – gdy przesłane do kanału poprzez Microsoft Flow lub Bot, lub za pośrednictwem dowolnej aplikacji przez zdefiniowany webhook:
Struktura JSON, która definiuje kartę, posiada wiele opcji. Jest zbudowana z dwóch, głównych obszarów: Card definition i Sections.
{ "@type": "MessageCard", "@context": "https://schema.org/extensions", "summary": "", "themeColor": "", "title": "Card created: \"This is just a test\"", "sections": [ { … }, "potentialAction": [ { … } ] ] }
W części definicji Karty można ustalić podstawowe informacje na jej temat. Są to:
- title
- summary – właściwość używana i wyświetlana tylko w Outlook.
- themeColor – jest to kolorowa linia po lewej stronie karty. Zgodnie z dokumentacją zaleca się używania jej do stylowania ich np. do kolorów organizacji/ produktu, ale nie do wskazywania statusu.
- hideOriginalBody – właściwość ponownie używana jedynie przez Outlook.
- text – dodatkowy blok tekstu, wyświetlanego standardową czcionką poniżej tytułu karty.
W części Section można używać następujących elementów:
- facts – umożliwia wyświetlanie danych w zorganizowany sposób – jako tabelka.
- activity – blok zbudowany z obrazu, tytułu, podtytułu i dodatkowego tekstu.
- text – dodatkowy blok tekstu.
- image
- heroImage – różni się od zwykłego obrazu tym, że wyświetlany jest na całą szerokość karty.
- potentialAction – blok dedykowany akcjom (opisane poniżej). Akcje można również definiować poza obszarem „Sections”.
Pamiętaj!
Możesz użyć tylko raz właściwości każdego typu w pojedynczym obiekcie „Sekcja”, jednak możesz mieć wiele obiektów (ponieważ Sekcja jest tablicą). Ponadto – obrazy nie mogą być definiowane przez URI. Musisz użyć bezwzględnej ścieżki do obrazu dostępnego anonimowo (lub tam, gdzie aktualnie zalogowany użytkownik ma dostęp).
W przypadku Potential action możesz wybrać jeden z następujących rodzajów działań:
- OpenUri
- HttpPost
- ActionCard
- InvokeAddInCommand
- ActionRequest (nowa wersja starej Transaction)
Tutaj również – może istnieć więcej niż jedna akcja, ponieważ potentialAction to tablica.
Każdorazowo używając bloku „text” pamiętaj o tym, że możesz go teskt w nim wpisany sformatować! (https://docs.microsoft.com/en-us /outlook/actionable-messages/reference-card-reference#text-formatting)
Chciałbym zwrócić Twoją uwagę na dwa, moim zdaniem, najciekawsze typy akcji: ActionCard, która umożliwia wyświetlanie tzw. „sub-cards” z polami formularza i innymi aktywnymi elementami. Drugą jest ActionRequest – działanie umożliwiające użycie funkcjonalności płatności bezpośrednio z karty, bez potrzeby zmuszania użytkownika do opuszczenia aplikacji.
Jeśli szukasz jeszcze bardziej precyzyjnych informacji nt. struktury Message Cards, polecam przeczytanie dokumentacji:
- https://docs.microsoft.com/en-us/outlook/actionable-messages/message-card-reference
- https://docs.microsoft.com/en-us/outlook/payments/action-request
- Playground: https://messagecardplayground.azurewebsites.net/
- Message Debugger dla Outlook: https://appsource.microsoft.com/en-us/product/office/WA104381686?src=office&corrid=9db12891-bdb6-45ee-8d66-5c80452a7b57&omexanonuid=bacf4b91-3499-4961-81c2-cf603a4e437a&referralurl=
Ważne!
Należy zauważyć, że Message Cards są już przestarzałe i zastępowane przez ich młodszego następcę: Adaptive Cards Microsoft zaleca migrację (w miarę możliwości) z formatu Message do Adaptive Cards: https://docs.microsoft.com/en-us/outlook/actionable-messages/adaptive-card
Administracja Message Cards
Warto wiedzieć, że administrator może wyłączyć mechanizm renderowania Message Cards zarówno w programie Outlook, jak i Teams, używając cmdletu Set-OrganizationConfig: https://docs.microsoft.com/en-us/powershell/module/exchange/organization/set-organizationconfig
Działający przykład (aka demo ;))
Rozwiązanie, które za chwilę zobaczysz, łączy przepływy pracy w SharePoint (zbudowane z użyciem rozwiązania firmy trzeciej – Nintex) i Microsoft Teams, dzięki czemu proces funkcjonuje w modelu „Digital Workplace”. Zobaczmy, jak to działa:
- W SharePoint użytkownik tworzy element, który wymaga zatwierdzenia
- Workflow przypisuje zadanie i w tym momencie wysyła również, za pomocą webhook, przygotowany kod JSON Message Card do Teams.
- Zatwierdzający może zatem wykonać zadanie w dowolny sposób: za pomocą natywnego zadania SharePoint, za pomocą Actionable Message w Outlooku lub przy użyciu karty w Microsoft Teams.
- Skupmy się na Teams – zatwierdzający decyduje, czy zaakceptować, czy odrzucić wniosek i klika na odpowiadający przycisk.
- Message Card jest odświeżana i zamiast poprzedniej treści wyświetla teraz potwierdzenie wykonania akceptacji.
Workflow
Przepływ pracy SharePoint jest stworzony za pomocą Nintex. Jest on dość prosty: po utworzeniu elementu przypisuje zadanie do zatwierdzenia, a jednocześnie tworzy Message Card i wysyła ją poprzez webhook do zatwierdzenia w wybranym kanale, w Microsoft Teams:
Wysyłanie Message Card do Microsoft Teams
Aby móc opublikować Message Card, musisz najpierw utworzyć webhook dla kanału. Aby to zrobić, najpierw przejdź do strony „Manage team” w zespole, do którego chcesz wysyłać karty:
Następnie przejdź do zakładki „Apps” i tam kliknij przycisk „More apps”:
Następnie wpisz hasło „Webhook” w polu wyszukiwania i kliknij w kafelek, który się pojawi:
Następnie klknij przysik „Open” i potem wybierz kanał, do którego mają być wysyłane karty. Na koniec kliknij przycisk „Set up”:
Finalnie ustaw nazwę webhooka (będzie wyświetlana jako nazwa nadawcy wiadomości), wgraj ikonę (avatar) i naciśnij przycisk „Create”:
Na koniec skopiuj wygenerowany URL i naciśnij przycisk „Done”:
Ważne!
Skopiowany URL jest tym, który będzie używany przez akcję „Web request” w przepływie pracy, który posłuży do wysłania Message Card.
Następnie należy zdefiniować kod JSON Message Card. Ja swój stworzyłem za pomocą Message Cards Playground, a następnie wstawiłem do niego dynamiczne placeholdery, dzięki czemu po przepływ pracy zastąpi je rzeczywistymi danymi i karta będzie naprawdę dostosowana do konkretnych potrzeb. Korzystając z sekcji „potentialActions”, umieściłem przyciski do zatwierdzenia/ odrzucenia żądania, które po kliknięciu uruchamia akcję HttpPOST i wysyłają, wraz z decyzją i komentarzem, identyfikator zadania SharePoint:
{ "@@type": "ActionCard", "name": "Approve", "inputs": [ { "@@type": "TextInput", "id": "ApprovalComment", "isMultiline": true, "title": "Comment (optional)" } ], "actions": [ { "@@type": "HttpPOST", "name": "Submit", "target": "FLOW URL", "headers": [ { "name": "content-type", "value": "application/json" }, { "name": "authorization", "value": "" } ], "bodyContentType": "application/json", "body": "{\"approved\":true, \"comment\":\"{{ApprovalComment.value}}\", \"taskID\":10" } ] }
Wygenerowana karta wygląda następująco:
Zapisywanie wyniku i odświeżanie Karty
Aby obsłużyć działania z Message Card, zdecydowałem się użyć Microsoft Flow, który jest uruchamiany przez przychodzące żądanie sieci Web, używając następującego schematu body:
{ "type": "object", "properties": { "name": { "type": "string" }, "inputParameters": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "value": { "type": "string" } }, "required": [ "id", "value" ] } }, "actionId": { "type": "string" }, "potentialAction": { "type": "string" }, "integrationId": { "type": "string" }, "meta": { "type": "string" }, "clientInfo": { "type": "object", "properties": { "locale": { "type": "string" }, "country": { "type": "string" }, "platform": { "type": "string" }, "clientVersion": { "type": "string" } } } } }
Następnie parsuję właściwość „Body”, aby uzyskać wynik zadania, komentarz i identyfikator zadania, używając następującego schematu:
Następnie, w zależności od wyniku, Flow albo aktualizuje zadanie dla wyniku „Approved” lub „Rejected”:
Teraz „kluczowa” funkcjonalność: wysyłanie odpowiedzi do Message Card. Jak można przeczytać tutaj: https://docs.microsoft.com/en-us/outlook/actionable-messages/message-card-reference#refresh-cards i tutaj: https://docs.microsoft.com/en -us/outlook/actionable-messages/message-card-reference#reporting-an-actions-execution-success-or-failure w celu aktualizacji karty musi ona otrzymać żądanie z następującymi nagłówkami:
- CARD-UPDATE-IN-BODY – true|false, czy zastąpić aktualną treść karty, czy nie
- CARD-ACTION-STATUS – wiadomość pokazywana jako komentarz, poniżej karty.
Jeśli nagłówek „CARD-UPDATE-IN-BODY” jest ustawiony na „true”, karta oczekuje, że w odpowiedzi otrzyma zawartość nowej karty. Aby dynamicznie zbudować Message Card, którą zastąpisz kartę pokazującą zadanie, spróbuj zapisać jak najwięcej szczegółów dotyczących zadania w parametrze „Body” karty zadania. Potem będziesz mógł użyć ich w Flow, aby zbudować kartę wyświetlającą potwierdzenie wykonania zadania 🙂
Ważne!
Jeśli zobaczysz znak „@” w dowolnym atrybucie treści JSON Message Card w Twoim Flow, dodaj do niego dodatkowy znak „@” –> „@@”. Bez tego nie będziesz w stanie zapisać / wykonać Flow.
Działające rozwiązanie
Poniżej znajdziesz animację pokazującą, jak działa całe rozwiązanie!
Czego się nauczyłem?
- Nie możesz skorzystać z funkcji „Mention” korzystając z Message Cards
- Nie możesz wysłać karty w prywatnej wiadomości
- Nie możesz uzyskać kontekstu użytkownika, który kliknie przycisk i przekaż go do Flow
Dziękuję, że dotarłeś tak daleko! Ten post jest już drugim z serii, w której możesz dowiedzieć się o:
- Wprowadzenie do Adpative Cards
- Message Cards – case study i how-to
- Adaptive Cards – case study i how-to
- Co w planach dla wersji 2.0 (mam nadzieję, z przykładami :))
Czy chcesz dowiedzieć się więcej o kartach adaptacyjnych? Skontaktuj się ze mną lub zostaw komentarz.